/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package aqu.controlador.CuentasPorCobrar;


import aqu.bean.generico.BeanGenerico;
import aqu.controlador.Contabilidad.PlanCuentasController;
import aqu.persistencia.Dao.Contabilidad.ConCabeceracontableManager;
import aqu.persistencia.Dao.Contabilidad.ConDetallecontableManager;
import aqu.persistencia.Dao.CuentasPorCobrar.CxcCabeceraFacturaManager;
import aqu.persistencia.Dao.CuentasPorCobrar.CxcCabeceraRetencionManager;
import aqu.persistencia.Dao.CuentasPorCobrar.CxcClienteManager;
import aqu.persistencia.Dao.CuentasPorCobrar.CxcDetalleFacturaManager;
import aqu.persistencia.Dao.CuentasPorCobrar.CxcDetalleRetencionManager;
import aqu.persistencia.Dao.CuentasPorCobrar.CxcEstadoFacturaManager;
import aqu.persistencia.Dao.CuentasPorPagar.CxpRetencionManager;
import aqu.persistencia.Dao.CuentasPorPagar.CxpTipoContribuyenteRetencionManager;
import aqu.persistencia.entity.*;
import aqu.persistencia.utilidad.MessagesController;
import aqu.persistencia.utilidad.Reportes;
import aqu.persistencia.utilidad.TotalDetalle;
import com.icesoft.faces.component.ext.RowSelectorEvent;
import com.sun.corba.se.impl.orbutil.closure.Constant;
import i18n.Constantes;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;


/**
 *
 * @author Verito Ramirez
 *         Victor Jaramillo
 */    
@ManagedBean(name = "facturaControllerCxc")
@ViewScoped
public class FacturaController extends BeanGenerico {

    private CxcCabeceraFactura cabeceraFactura;
    private CxcDetalleFactura detalleFactura;
    private CxcEstadoFactura estadofacturaGroup; 
    private CxcCliente clienteGroup, clienteAux;
    private CxcCabeceraRetencion retencionGroup, cabeceraRetencion;
    private CxpRetencion retencionDetalleGroup;
    private CxpTipoContribuyenteRetencion tipoConRet;
    private ConCabeceracontable cabeceraContable;
    private ConDetallecontable detalleContable;
    
    private List<CxcCabeceraFactura> listaCabecera;
    private List<CxcDetalleFactura> listaDetalle;      
    private List<CxcEstadoFactura> listaEstadoFactura;
    private List<CxcCliente> listaCliente;
    private List<CxcCabeceraRetencion> listaCabeceraRetencion;
    private List<CxpRetencion> listaRetencionDet;
    private List<CxpTipoContribuyenteRetencion> listaTipConReT;
    private List<ConCabeceracontable> listaCabeceraContable;
    private List<ConDetallecontable> listaDetalleContable;
    private List<CxcDetalleRetencion> listaDetalleRetencion;
    
    private CxcCabeceraFacturaManager CxcCabecerafacturaManager = new CxcCabeceraFacturaManager();   
    private CxcDetalleFacturaManager CxcDetallefacturaManager = new CxcDetalleFacturaManager();
    private CxcEstadoFacturaManager CxcEstadoFacturaManager = new CxcEstadoFacturaManager();
    private CxcClienteManager CxcClienteManager= new CxcClienteManager();
    private CxcCabeceraRetencionManager cxcCabeceraretencionManager = new CxcCabeceraRetencionManager();
    private CxpRetencionManager cxpRetencionManager = new CxpRetencionManager();
    private CxpTipoContribuyenteRetencionManager cxpTipoConRetManager = new CxpTipoContribuyenteRetencionManager();
    private ConCabeceracontableManager conCabeceraContableManager = new ConCabeceracontableManager();
    private ConDetallecontableManager conDetallecontableManager = new ConDetallecontableManager();
    private CxcDetalleRetencionManager cxpDetalleRetencionManager = new CxcDetalleRetencionManager();
    
    private TotalDetalle totalDetalle;
    private List<TotalDetalle> listaTotalDetalle;
    private Date FecInicio;
    private Date FecFin = new Date();
    private boolean panelvisible;
    private int rowBanderaDetalle = -1;    
   
    
    public FacturaController() {

        int dias = Integer.parseInt(MessagesController.obtenervariable("var_fecha_ini_default"));
        
        cabeceraFactura = new CxcCabeceraFactura();
        detalleFactura = new CxcDetalleFactura();
        estadofacturaGroup=new CxcEstadoFactura();
        clienteGroup = new CxcCliente();
        clienteAux = new CxcCliente();
        retencionGroup=new CxcCabeceraRetencion();
        retencionDetalleGroup = new CxpRetencion();
        tipoConRet = new CxpTipoContribuyenteRetencion();
        cabeceraContable = new ConCabeceracontable();
        cabeceraRetencion = new CxcCabeceraRetencion();
        detalleContable = new ConDetallecontable();
        
        listaEstadoFactura = CxcEstadoFacturaManager.getList();
        listaCliente=CxcClienteManager.getListOrdenado("cxcNombreCli");
        listaCabeceraRetencion= cxcCabeceraretencionManager.getList();
        listaCabecera = CxcCabecerafacturaManager.getList();
        listaRetencionDet = cxpRetencionManager.getList();
        listaTipConReT = cxpTipoConRetManager.getList();
        listaDetalleRetencion = new ArrayList<CxcDetalleRetencion>();
        listaDetalleContable = new ArrayList<ConDetallecontable>();
        
        Calendar c = Calendar.getInstance();
        c.add(Calendar.DATE, -dias);
        Date date = c.getTime();
        FecInicio = date;
        totalDetalle = new TotalDetalle();
        listaTotalDetalle = new ArrayList<TotalDetalle>();
        listaTotalDetalle.add(totalDetalle);
    }    

    public void switchCabecera(CxcCabeceraFactura cabeceraFactura) {
        estadofacturaGroup = cabeceraFactura.getCxcCodigoEstFac();
        clienteGroup=cabeceraFactura.getCxcCodigoCli();
        
        if(cabeceraFactura.getCxcCodigoCabret() != null)
            retencionGroup=cabeceraFactura.getCxcCodigoCabret();
        else
            retencionGroup.setCxcCodigoCabret("-");

    }

    public ConCabeceracontable getCabeceraContable() {
        return cabeceraContable;
    }

    public void setCabeceraContable(ConCabeceracontable cabeceraContable) {
        this.cabeceraContable = cabeceraContable;
    }

    public CxcCabeceraRetencion getCabeceraRetencion() {
        return cabeceraRetencion;
    }

    public void setCabeceraRetencion(CxcCabeceraRetencion cabeceraRetencion) {
        this.cabeceraRetencion = cabeceraRetencion;
    }

    public ConDetallecontable getDetalleContable() {
        return detalleContable;
    }

    public void setDetalleContable(ConDetallecontable detalleContable) {
        this.detalleContable = detalleContable;
    }

    public List<ConCabeceracontable> getListaCabeceraContable() {
        return listaCabeceraContable;
    }

    public void setListaCabeceraContable(List<ConCabeceracontable> listaCabeceraContable) {
        this.listaCabeceraContable = listaCabeceraContable;
    }

    public List<ConDetallecontable> getListaDetalleContable() {
        return listaDetalleContable;
    }

    public void setListaDetalleContable(List<ConDetallecontable> listaDetalleContable) {
        this.listaDetalleContable = listaDetalleContable;
    }

    public List<CxcDetalleRetencion> getListaDetalleRetencion() {
        return listaDetalleRetencion;
    }

    public void setListaDetalleRetencion(List<CxcDetalleRetencion> listaDetalleRetencion) {
        this.listaDetalleRetencion = listaDetalleRetencion;
    }

    public ConCabeceracontableManager getConCabeceraContableManager() {
        return conCabeceraContableManager;
    }

    public void setConCabeceraContableManager(ConCabeceracontableManager conCabeceraContableManager) {
        this.conCabeceraContableManager = conCabeceraContableManager;
    }

    public ConDetallecontableManager getConDetallecontableManager() {
        return conDetallecontableManager;
    }

    public void setConDetallecontableManager(ConDetallecontableManager conDetallecontableManager) {
        this.conDetallecontableManager = conDetallecontableManager;
    }

    public CxcDetalleRetencionManager getCxpDetalleRetencionManager() {
        return cxpDetalleRetencionManager;
    }

    public void setCxpDetalleRetencionManager(CxcDetalleRetencionManager cxpDetalleRetencionManager) {
        this.cxpDetalleRetencionManager = cxpDetalleRetencionManager;
    }

    
    public CxcCliente getClienteAux() {
        return clienteAux;
    }

    public void setClienteAux(CxcCliente clienteAux) {
        this.clienteAux = clienteAux;
    }
    
    public CxcCabeceraFacturaManager getCxcCabecerafacturaManager() {
        return CxcCabecerafacturaManager;
    }

    public void setCxcCabecerafacturaManager(CxcCabeceraFacturaManager CxcCabecerafacturaManager) {
        this.CxcCabecerafacturaManager = CxcCabecerafacturaManager;
    }

    public CxcClienteManager getCxcClienteManager() {
        return CxcClienteManager;
    }

    public void setCxcClienteManager(CxcClienteManager CxcClienteManager) {
        this.CxcClienteManager = CxcClienteManager;
    }

    public CxcDetalleFacturaManager getCxcDetallefacturaManager() {
        return CxcDetallefacturaManager;
    }

    public void setCxcDetallefacturaManager(CxcDetalleFacturaManager CxcDetallefacturaManager) {
        this.CxcDetallefacturaManager = CxcDetallefacturaManager;
    }

    public CxcEstadoFacturaManager getCxcEstadoFacturaManager() {
        return CxcEstadoFacturaManager;
    }

    public void setCxcEstadoFacturaManager(CxcEstadoFacturaManager CxcEstadoFacturaManager) {
        this.CxcEstadoFacturaManager = CxcEstadoFacturaManager;
    }

    public Date getFecFin() {
        return FecFin;
    }

    public void setFecFin(Date FecFin) {
        this.FecFin = FecFin;
    }

    public Date getFecInicio() {
        return FecInicio;
    }

    public void setFecInicio(Date FecInicio) {
        this.FecInicio = FecInicio;
    }

    public CxcCabeceraFactura getCabeceraFactura() {
        return cabeceraFactura;
    }

    public void setCabeceraFactura(CxcCabeceraFactura cabeceraFactura) {
        this.cabeceraFactura = cabeceraFactura;
    }

    public CxcCliente getClienteGroup() {
        return clienteGroup;
    }

    public void setClienteGroup(CxcCliente clienteGroup) {
        this.clienteGroup = clienteGroup;
    }

    public CxcCabeceraRetencionManager getCxcCabeceraretencionManager() {
        return cxcCabeceraretencionManager;
    }

    public void setCxcCabeceraretencionManager(CxcCabeceraRetencionManager cxcCabeceraretencionManager) {
        this.cxcCabeceraretencionManager = cxcCabeceraretencionManager;
    }

    public CxpRetencionManager getCxpRetencionManager() {
        return cxpRetencionManager;
    }

    public void setCxpRetencionManager(CxpRetencionManager cxpRetencionManager) {
        this.cxpRetencionManager = cxpRetencionManager;
    }

    public CxpTipoContribuyenteRetencionManager getCxpTipoConRetManager() {
        return cxpTipoConRetManager;
    }

    public void setCxpTipoConRetManager(CxpTipoContribuyenteRetencionManager cxpTipoConRetManager) {
        this.cxpTipoConRetManager = cxpTipoConRetManager;
    }

    public CxcDetalleFactura getDetalleFactura() {
        return detalleFactura;
    }

    public void setDetalleFactura(CxcDetalleFactura detalleFactura) {
        this.detalleFactura = detalleFactura;
    }

    public CxcEstadoFactura getEstadofacturaGroup() {
        return estadofacturaGroup;
    }

    public void setEstadofacturaGroup(CxcEstadoFactura estadofacturaGroup) {
        this.estadofacturaGroup = estadofacturaGroup;
    }

    public List<CxcCabeceraFactura> getListaCabecera() {
        String parametro = "-";
        if(clienteAux.getCxcCodigoCli() != null)
            parametro = clienteAux.getCxcCodigoCli();        
        if(parametro.equals("-"))
            listaCabecera = CxcCabecerafacturaManager.buscarporFecha(FecInicio, FecFin);
        else
            listaCabecera = CxcCabecerafacturaManager.buscarporCliente(clienteAux);
        return listaCabecera;
    }

    public void setListaCabecera(List<CxcCabeceraFactura> listaCabecera) {
        this.listaCabecera = listaCabecera;
    }

    public List<CxcCabeceraRetencion> getListaCabeceraRetencion() {
        return listaCabeceraRetencion;
    }

    public void setListaCabeceraRetencion(List<CxcCabeceraRetencion> listaCabeceraRetencion) {
        this.listaCabeceraRetencion = listaCabeceraRetencion;
    }

    public List<CxcCliente> getListaCliente() {
        return listaCliente;
    }

    public void setListaCliente(List<CxcCliente> listaCliente) {
        this.listaCliente = listaCliente;
    }

    public List<CxcDetalleFactura> getListaDetalle() {
        return listaDetalle;
    }

    public void setListaDetalle(List<CxcDetalleFactura> listaDetalle) {
        this.listaDetalle = listaDetalle;
    }

    public List<CxcEstadoFactura> getListaEstadoFactura() {
        return listaEstadoFactura;
    }

    public void setListaEstadoFactura(List<CxcEstadoFactura> listaEstadoFactura) {
        this.listaEstadoFactura = listaEstadoFactura;
    }

    public List<CxpRetencion> getListaRetencionDet() {
        listaRetencionDet = cxpRetencionManager.getList();
        return listaRetencionDet;
    }

    public void setListaRetencionDet(List<CxpRetencion> listaRetencionDet) {
        this.listaRetencionDet = listaRetencionDet;
    }

    public List<CxpTipoContribuyenteRetencion> getListaTipConReT() {
       listaTipConReT = cxpTipoConRetManager.buscarTipoContribuyente(
                        cabeceraFactura.getCxcCodigoCli().getCxpCodigoTipCon(),
                        detalleFactura.getCxpCodigoRet());
             
        return listaTipConReT;
    }

    public void setListaTipConReT(List<CxpTipoContribuyenteRetencion> listaTipConReT) {
        this.listaTipConReT = listaTipConReT;
    }

    public List<TotalDetalle> getListaTotalDetalle() {
        return listaTotalDetalle;
    }

    public void setListaTotalDetalle(List<TotalDetalle> listaTotalDetalle) {
        this.listaTotalDetalle = listaTotalDetalle;
    }

    public CxpRetencion getRetencionDetalleGroup() {
        return retencionDetalleGroup;
    }

    public void setRetencionDetalleGroup(CxpRetencion retencionDetalleGroup) {
        this.retencionDetalleGroup = retencionDetalleGroup;
    }

    public CxcCabeceraRetencion getRetencionGroup() {
        return retencionGroup;
    }

    public void setRetencionGroup(CxcCabeceraRetencion retencionGroup) {
        this.retencionGroup = retencionGroup;
    }

    public int getRowBanderaDetalle() {
        return rowBanderaDetalle;
    }

    public void setRowBanderaDetalle(int rowBanderaDetalle) {
        this.rowBanderaDetalle = rowBanderaDetalle;
    }

    public CxpTipoContribuyenteRetencion getTipoConRet() {
        return tipoConRet;
    }

    public void setTipoConRet(CxpTipoContribuyenteRetencion tipoConRet) {
        this.tipoConRet = tipoConRet;
    }

    public TotalDetalle getTotalDetalle() {
        return totalDetalle;
    }

    public void setTotalDetalle(TotalDetalle totalDetalle) {
        this.totalDetalle = totalDetalle;
    }

    
    
    
    
    public boolean isPanelvisible() {
        return panelvisible;
    }

    public void setPanelvisible(boolean panelvisible) {
        this.panelvisible = panelvisible;
    }
    
    public void llamarPanelvisible(ActionEvent event) {
        panelvisible = !panelvisible;
    }

    public void reporte(ActionEvent actionEvent){
        try {
            if(cabeceraFactura.getCxcCodigoCabfac() == null)
                throw new Exception("Debe elegir un registro para continuar...!!!");
            Reportes reporte = new Reportes();
            String nomArchivo = "cxcFactura";
            Map parametro = new HashMap();
            parametro.put("cxc_CodigoCabFac", cabeceraFactura.getCxcCodigoCabfac());
            reporte.runReporte(nomArchivo, parametro);
        } catch (Exception ex) {
            Logger.getLogger(PlanCuentasController.class.getName()).log(Level.SEVERE, null, ex);
            MessagesController.addInfo("Mensaje de error :", ex.getMessage());
            llamarPanelvisible(null);
        }
    }

    public void nuevo(ActionEvent actionEvent) {
        cabeceraFactura = new CxcCabeceraFactura();        
        cabeceraFactura.setCxcFechaVencimientoCabfac(FecFin);
    }

    public String eliminar() {
        String cabretencion=retencionGroup.getCxcCodigoCabret();
        try {
            
            if (!cabretencion.equals("-")) {
                cabeceraFactura.setCxcCodigoCabret(retencionGroup);
            } 
            
            else {
                
                cabeceraFactura.setCxcCodigoCabret(null);
            }
            CxcCabeceraFactura cabecerafacturaTemp = (CxcCabeceraFactura) (cabeceraFactura);
            if (CxcCabecerafacturaManager.delete(cabecerafacturaTemp) == false) {
                llamarPanelvisible(null);

            }
           
            cabeceraFactura=new CxcCabeceraFactura();
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

        return "index";

    }

    public void insertar(ActionEvent actionEvent) {        
        String cabretencion=retencionGroup.getCxcCodigoCabret();
        String numFactura = "";
        try { 
            if(cabeceraFactura.getCxcNumeroCabfac() == null)
                throw  new Exception("El Numero de Factura no puede ir en blanco");
            else{
                numFactura = cabeceraFactura.getCxcNumeroCabfac();
                numFactura = MessagesController.LlenarConCeros(numFactura, 
                        Integer.parseInt(MessagesController.obtenervariable("tam_NumFactura")));
            }
            cabeceraFactura.setCxcCodigoCabfac(MessagesController.obtenerkeyautomatico("cxc_cabecerafactura", "CXC_CODIGO_CABFAC"));
            cabeceraFactura.setCxcNumeroCabfac(numFactura);
            cabeceraFactura.setCxcCodigoEstFac(estadofacturaGroup);
            cabeceraFactura.setCxcCodigoCli(clienteGroup);
            
            if (!cabretencion.equals("-")) {
                cabeceraFactura.setCxcCodigoCabret(retencionGroup);
            } 
            
            else {
               
                cabeceraFactura.setCxcCodigoCabret(null);
            }

            if (CxcCabecerafacturaManager.create(cabeceraFactura) == false) {
                llamarPanelvisible(null);                
            }
            
            cabeceraFactura=new CxcCabeceraFactura();
            
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

    }

    public void modificar(ActionEvent actionEvent) {
       String cabretencion=retencionGroup.getCxcCodigoCabret(); 
       String numFactura = "";
        try {
            if(cabeceraFactura.getCxcNumeroCabfac() == null)
                throw  new Exception("El Numero de Factura no puede ir en blanco");
            else{
                numFactura = cabeceraFactura.getCxcNumeroCabfac();
                numFactura = MessagesController.LlenarConCeros(numFactura, 
                        Integer.parseInt(MessagesController.obtenervariable("tam_NumFactura")));
            }                    
            cabeceraFactura.setCxcCodigoEstFac(estadofacturaGroup);
            cabeceraFactura.setCxcCodigoCli(clienteGroup);
            if(!cabretencion.equals("-"))
            {
                cabeceraFactura.setCxcCodigoCabret(retencionGroup);
            }
            else {
                cabeceraFactura.setCxcCodigoCabret(null);
            }
            
            if (CxcCabecerafacturaManager.update(cabeceraFactura) == false) {
                llamarPanelvisible(null);

            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }


    }

    public void guardarDetalle(ActionEvent actionEvent) {
        
        try {
            /*
             * cabeceraContable)lista); cabeceraFactura (lista); cabeceraRetencion(lista); 
             * detalleContable(lista); detalleFactura(lista); detalleRetencionGroup(lista);
             * listaDetalleContable(lista); listaDetalleRetencion(lista);
             */
            CxpEstadoRetencion estRetencion = new CxpEstadoRetencion();
            CxpTipoDocumento tipoDocumento = new CxpTipoDocumento();
            CxcDetalleRetencion detalleRetencionAux = new CxcDetalleRetencion();
            CxpImpuesto impuesto= new CxpImpuesto();
            ConCuenta conCuentaAux = new ConCuenta();
            ConEstadoCabecera conEstCab = new ConEstadoCabecera();
            ConLugarAplicacion conLugAplcacion = new ConLugarAplicacion();
            ConTipoAsiento tipoAsiento = new ConTipoAsiento();
            Date fechaHoy = new Date();
            cabeceraContable = new ConCabeceracontable();
            detalleContable = new ConDetallecontable();
            listaDetalleContable = new ArrayList<ConDetallecontable>();
            listaDetalleRetencion = new ArrayList<CxcDetalleRetencion>();
            Double totalFactAux =0.0, ValorFacRet = 0.0;
            int Bandera = 1;
            int numDetalles = listaDetalle.size();
            BigDecimal porcentaje;
            Double Subtotal = 0.0, iva = 0.0, ivaRetencion = 0.0, retencion = 0.0,
                    porcentajeIVA;
            String aplicaIVA , aplicaRet, lugarAplica;
            aplicaRet = listaDetalle.get(0).getCxcAplicaRetDetFact();
            aplicaIVA = listaDetalle.get(0).getCxcAplicaIvaDetFac();
            porcentajeIVA = Double.parseDouble(MessagesController.obtenervariable("impuesto_IVA"));
            
            estRetencion.setCxpCodigoEstRet("1");
            tipoDocumento.setCxpCodigoTipDoc("1");   
            conCuentaAux.setConCodigoCue("1.");
            
            detalleFactura = listaDetalle.get(0);
            
            //Llenar Cabecear de Retencion
            cabeceraRetencion.setCxcCodigoCabret(MessagesController.obtenerkeyautomatico("cxp_cabeceraretencion", "CXP_CODIGO_CABRET"));
            cabeceraRetencion.setCxpCodigoEstRet(estRetencion);
            cabeceraRetencion.setCxpCodigoTipDoc(tipoDocumento);
            cabeceraRetencion.setCxcCodigoCli(cabeceraFactura.getCxcCodigoCli());
            cabeceraRetencion.setCxcFechaEmisionCabret(fechaHoy);
            cabeceraRetencion.setCxcNumeroCabret(MessagesController.obtenerkeyautomaticosinceros("cxp_cabeceraretencion", "CXP_NUMERO_CABRET"));
            String numRetencion = cabeceraRetencion.getCxcNumeroCabret();
            numRetencion = MessagesController.LlenarConCeros(numRetencion,  Integer.parseInt(MessagesController.obtenervariable("tam_NumRetencion")));
            cabeceraRetencion.setCxcNumeroCabret(numRetencion);
            cabeceraRetencion.setCxcNumeroDocCabret("");
            cabeceraRetencion.setCxcObservacionCabret("Retencion, N° Fac: " + 
                    Long.parseLong(cabeceraFactura.getCxcNumeroCabfac()) +""
                    + ", Cliente: " + cabeceraFactura.getCxcCodigoCli().getCxcNombreCli());
            cabeceraRetencion.setCxcTipoComprobanteCabret("Factura");
            //Llenar Detalle de Retencion
            detalleRetencionAux.setCxpCodigoCabRet(cabeceraRetencion);
            conEstCab.setConCodigoEstCab("2");
            tipoAsiento.setConCodigoTipAsi(MessagesController.obtenervariable("tipAsi_Factura"));            
            String nomProveedor = "";
            int lenghtNomCli = cabeceraFactura.getCxcCodigoCli().getCxcNombreCli().length();
            if(lenghtNomCli > 20) 
                nomProveedor=cabeceraFactura.getCxcCodigoCli().getCxcNombreCli().substring(0, 20);
            else 
                nomProveedor=cabeceraFactura.getCxcCodigoCli().getCxcNombreCli().substring(0,lenghtNomCli);
            String descripcion = nomProveedor.concat(", N° Fact " + Long.parseLong(cabeceraFactura.getCxcNumeroCabfac()));
            //Creacion de Cabecera Contable
            cabeceraContable.setConCodigoCabcon(MessagesController.obtenerkeyautomatico("con_cabeceracontable", "CON_CODIGO_CABCON"));
            cabeceraContable.setConCodigoEstcab(conEstCab);
            cabeceraContable.setConCodigoTipasi(tipoAsiento);
            cabeceraContable.setConDescripcionCabcon(descripcion);
            cabeceraContable.setConFechaCabcon(cabeceraFactura.getCxcFechaVencimientoCabfac());
            cabeceraContable.setConModuloCabcon(Constantes.CXC_MODULO);
            cabeceraContable.setConNumeroCabcon(cabeceraFactura.getCxcNumeroCabfac());                        
            cabeceraContable.setCxcCliente(cabeceraFactura.getCxcCodigoCli());
            /*
             * Cuando ya se trabaje con multiempresas esto se debe quitar y 
             * trabajar con la empresa que se haya elegido al principio
             */
            ConEmpresa empresa = new ConEmpresa();
            empresa.setConCodigoEmp("01");
            cabeceraContable.setConCodigoEmp(empresa);
            
            //Se agrega al detalleContable el Subtotal.
            Subtotal = Double.valueOf(detalleFactura.getCxcCantidadDetfac());
            detalleContable.setConCantidadDetcon(Subtotal);
            detalleContable.setConCodigoCabcon(cabeceraContable);
            detalleContable.setConCodigoCue(conCuentaAux);
            conLugAplcacion.setConCodigoLugApl(Constantes.LUGARAPLICACION_HABER);
            detalleContable.setConCodigoLugapl(conLugAplcacion);
            listaDetalleContable.add(detalleContable);
            detalleContable = new ConDetallecontable();
            conLugAplcacion = new ConLugarAplicacion();
            conCuentaAux = new ConCuenta();
            for (int i = 0; i < numDetalles; i++) {                                
                if(aplicaIVA.equals("SI")){ 
                    //Se agrega al detalleContable el iva
                    iva = Subtotal * porcentajeIVA;
                    conCuentaAux.setConCodigoCue(Constantes.CXC_FACTURA_CUENTAIVA);                        
                    detalleContable.setConCantidadDetcon(iva);
                    detalleContable.setConCodigoCabcon(cabeceraContable);
                    detalleContable.setConCodigoCue(conCuentaAux);
                    conLugAplcacion.setConCodigoLugApl(Constantes.LUGARAPLICACION_HABER);
                    detalleContable.setConCodigoLugapl(conLugAplcacion);
                    listaDetalleContable.add(detalleContable);
                    detalleContable = new ConDetallecontable();
                    conCuentaAux = new ConCuenta();
                    conLugAplcacion = new ConLugarAplicacion();
                }
                totalFactAux = iva + Subtotal;
                ValorFacRet = totalFactAux;
                if(aplicaRet.equals("SI")){
                    listaTipConReT = cxpTipoConRetManager.buscarTipoContribuyente(
                            cabeceraFactura.getCxcCodigoCli().getCxpCodigoTipCon(),
                            listaDetalle.get(0).getCxpCodigoRet());
                    for (int j = 0; j < listaTipConReT.size(); j++) {
                        tipoConRet = listaTipConReT.get(j);
                        detalleFactura = listaDetalle.get(i);
                        porcentaje = BigDecimal.valueOf(tipoConRet.getCxpPorcentajeRetencionTipConRet());     
                        lugarAplica = tipoConRet.getCxpCodigoImp().getCxpCodigoImp();                

                        // Retenciones: 1. IVA -- 2. Fuente
                        if(aplicaRet.equals("SI")){
                            if(lugarAplica.equals("1")){
                                //Se calcula retencion iva y se agregan detalleREtencion y detalleContable
                                ivaRetencion = iva * (porcentaje.doubleValue() / 100);
                                ValorFacRet = ValorFacRet - ivaRetencion;
                                detalleRetencionAux.setCxcBaseImponibleDetRet(iva);                            
                                impuesto.setCxpCodigoImp("2");
                                detalleRetencionAux.setCxpCodigoImp(impuesto);
                                detalleRetencionAux.setCxpCodigoRet(tipoConRet.getCxpCodigoRet());
                                detalleRetencionAux.setCxcPorcentajeDetRet(tipoConRet.getCxpPorcentajeRetencionTipConRet());
                                detalleRetencionAux.setCxcValorDetRet(ivaRetencion);
                                detalleContable.setConCantidadDetcon(ivaRetencion);
                                detalleContable.setConCodigoCabcon(cabeceraContable);
                                detalleContable.setConCodigoCue(tipoConRet.getConCodigoCue());
                                conLugAplcacion.setConCodigoLugApl(Constantes.LUGARAPLICACION_HABER);
                                detalleContable.setConCodigoLugapl(conLugAplcacion);
                                listaDetalleContable.add(detalleContable);
                                detalleContable = new ConDetallecontable();
                                conLugAplcacion = new ConLugarAplicacion();
                                listaDetalleRetencion.add(detalleRetencionAux);
                            }else{
                                //Se calcula retencion Fuente y se agregan detalleREtencion y detalleContable
                                retencion = Subtotal * (porcentaje.doubleValue() / 100);
                                ValorFacRet = ValorFacRet - retencion;
                                detalleRetencionAux.setCxcBaseImponibleDetRet(Subtotal);
                                impuesto.setCxpCodigoImp("2");
                                detalleRetencionAux.setCxpCodigoImp(impuesto);
                                detalleRetencionAux.setCxpCodigoRet(tipoConRet.getCxpCodigoRet());
                                detalleRetencionAux.setCxcPorcentajeDetRet(tipoConRet.getCxpPorcentajeRetencionTipConRet());
                                detalleRetencionAux.setCxcValorDetRet(retencion);
                                detalleContable.setConCantidadDetcon(retencion);
                                detalleContable.setConCodigoCabcon(cabeceraContable);
                                detalleContable.setConCodigoCue(tipoConRet.getConCodigoCue());
                                conLugAplcacion.setConCodigoLugApl(Constantes.LUGARAPLICACION_DEBE);
                                detalleContable.setConCodigoLugapl(conLugAplcacion);
                                listaDetalleContable.add(detalleContable);
                                detalleContable = new ConDetallecontable();
                                conLugAplcacion = new ConLugarAplicacion();
                                listaDetalleRetencion.add(detalleRetencionAux);
                            }
                        }                    
                    }
                }
                               
            }
            //Agregar key automaticas a la lista de retenciones en Detalle
            
            
            detalleContable.setConCantidadDetcon(ValorFacRet);
            detalleContable.setConCodigoCabcon(cabeceraContable);
            conCuentaAux.setConCodigoCue(Constantes.CXC_FACTURA_CUENTA);
            detalleContable.setConCodigoCue(conCuentaAux);
            conLugAplcacion.setConCodigoLugApl(Constantes.LUGARAPLICACION_DEBE);
            detalleContable.setConCodigoLugapl(conLugAplcacion);
            listaDetalleContable.add(detalleContable);
            List<String> listakeyRetencion = MessagesController.obtenerlistakeyautomatico("cxc_detalleretencion", "CXC_CODIGO_DETRET", listaDetalleRetencion.size());
            List<String> listakeyDetFac = MessagesController.obtenerlistakeyautomatico("cxc_detallefactura", "CXC_CODIGO_DETFAC", listaDetalle.size());
            if(listaDetalle.size() >= 1){
                for (int i = 0; i < listaDetalle.size(); i++) {
                    if(listaDetalle.get(i).getCxcCodigoDetfac() == null)
                        listaDetalle.get(i).setCxcCodigoDetfac(listakeyDetFac.get(i));
                }
            }
            if(listaDetalleRetencion.size() >= 1){
                for (int i = 0; i < listaDetalleRetencion.size(); i++) {
                    if(listaDetalleRetencion.get(i).getCxcCodigoDetRet() == null)
                        listaDetalleRetencion.get(i).setCxcCodigoDetRet(listakeyRetencion.get(i));
                }
            }
            List<String> listakeyDetalle = MessagesController.obtenerlistakeyautomatico("con_detallecontable", "CON_CODIGO_DETCON", listaDetalleContable.size());
            for (int i = 0; i < listaDetalleContable.size(); i++) {
                if (listaDetalleContable.get(i).getConCodigoDetcon() == null) {
                    listaDetalleContable.get(i).setConCodigoDetcon(listakeyDetalle.get(i));
                } else {
                    //bandera que verifica si ya esta guardado el asiento para no volver hacerlo
                    Bandera = 0;
                }
            }
            //Si tiene retencion
            if(aplicaRet.equals("SI")){
                if(CxcDetallefacturaManager.create(detalleFactura) == true){
                    if(cxcCabeceraretencionManager.create(cabeceraRetencion) == true){
                        if(cxpDetalleRetencionManager.createbyListDetalle(listaDetalleRetencion) == true){
                            cabeceraFactura.setCxcCodigoCabret(cabeceraRetencion);
                            CxcCabecerafacturaManager.update(cabeceraFactura);
                            if(conCabeceraContableManager.create(cabeceraContable) == true){
                                if(conDetallecontableManager.createbyListDetalle(listaDetalleContable) == true){
                                    detalleFactura = new CxcDetalleFactura();
                                    totalDetalle = new TotalDetalle();
                                    cabeceraRetencion = new CxcCabeceraRetencion();
                                    cabeceraContable = new ConCabeceracontable();
                                    cabeceraFactura = new CxcCabeceraFactura();
                                    listaCabecera = new ArrayList<CxcCabeceraFactura>();
                                    listaCabeceraContable = new ArrayList<ConCabeceracontable>();
                                    listaCabeceraRetencion = new ArrayList<CxcCabeceraRetencion>();
                                    listaDetalle = new ArrayList<CxcDetalleFactura>();
                                    listaDetalleContable = new ArrayList<ConDetallecontable>();
                                    MessagesController.addInfo("El valor del IVA es: " + iva + "\n"
                                        + "\nSe aplica la retencion a: \n"
                                        + "\nRetencion a la fuente: " + retencion + "\n"
                                        + "\nRetencion del IVA: " + ivaRetencion); 
                                    llamarPanelvisible(null);
                                }
                            }
                        }
                    }                
                }else{
                    MessagesController.addError("No se pudo guardar el detalle favor verifique el error");
                    llamarPanelvisible(null);
                }
            }else{// Si no posee Retencion.
                if(CxcDetallefacturaManager.create(detalleFactura) == true){
                    if(conCabeceraContableManager.create(cabeceraContable) == true){
                        if(conDetallecontableManager.createbyListDetalle(listaDetalleContable) == true){
                            detalleFactura = new CxcDetalleFactura();
                            totalDetalle = new TotalDetalle();
                            cabeceraRetencion = new CxcCabeceraRetencion();
                            cabeceraContable = new ConCabeceracontable();
                            cabeceraFactura = new CxcCabeceraFactura();
                            listaCabecera = new ArrayList<CxcCabeceraFactura>();
                            listaCabeceraContable = new ArrayList<ConCabeceracontable>();
                            listaCabeceraRetencion = new ArrayList<CxcCabeceraRetencion>();
                            listaDetalle = new ArrayList<CxcDetalleFactura>();
                            listaDetalleContable = new ArrayList<ConDetallecontable>();
                            MessagesController.addInfo("El valor del IVA es: " + iva + "\n"
                                + "\nNo se aplica Retención\n"); 
                            llamarPanelvisible(null);
                        }
                    }                
                }else{
                    MessagesController.addError("No se pudo guardar el detalle favor verifique el error");
                    llamarPanelvisible(null);
                }
            }            
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }
    }
    
    public void nuevodetalle(ActionEvent actionEvent) {
        detalleFactura= new CxcDetalleFactura();
        retencionDetalleGroup = new CxpRetencion();
    }

    public String eliminarDetalle() {
        try {
            int Bandera = 1;
            for (int i = 0; i < listaDetalle.size(); i++) {
                if (listaDetalle.get(i).getCxcCodigoDetfac() != null) {
                    //bandera que verifica si ya esta guardado el asiento para no volver hacerlo
                    Bandera = 0;

                }
            }
            if (Bandera == 0) {
                MessagesController.addInfo("Mensaje de Informacion :", "La factura ya se encuentra guardada, no se puede eliminar");
                llamarPanelvisible(null);
            } else {
                if (rowBanderaDetalle >= 0) {
                    listaDetalle.remove(rowBanderaDetalle);
                    totalDetalle = new TotalDetalle();
                    listaTotalDetalle.set(0, totalDetalle);
                }
                rowBanderaDetalle = -1;
                nuevodetalle(null);
            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

        return "index";

    }

    public void insertarDetalle(ActionEvent actionEvent) {
        try {
            if(listaDetalle.size() == 1){
                throw  new Exception("La factura no puede tener mas de un Detalle.");
            }
            int Bandera = 1;
            for (int i = 0; i < listaDetalle.size(); i++) {
                if (listaDetalle.get(i).getCxcCodigoDetfac() != null) {
                    //bandera que verifica si ya esta guardado el asiento para no volver hacerlo
                    Bandera = 0;
                }
            }
            if(Bandera == 0){
                MessagesController.addInfo("Mensaje de Informacion :", "La factura ya se encuentra guardada no se puede modificar");
                llamarPanelvisible(null);
            }else {
                if (cabeceraFactura.getCxcCodigoCabfac() != null) {
                    detalleFactura.setCxcCodigoDetfac(null);                            
                    detalleFactura.setCxcCodigoCabfac((CxcCabeceraFactura) CxcCabecerafacturaManager.getElementById(cabeceraFactura.getCxcCodigoCabfac()));
                    if(detalleFactura.getCxcAplicaRetDetFact().equals("SI")){
                        if(!retencionDetalleGroup.getCxpCodigoRet().equals("-"))
                            detalleFactura.setCxpCodigoRet((CxpRetencion) cxpRetencionManager.getElementById(retencionDetalleGroup.getCxpCodigoRet()));
                        else
                            throw new Exception("Debe elejir una retención");
                    }else
                        detalleFactura.setCxpCodigoRet(null);
                    listaDetalle.add(detalleFactura);
                    detalleFactura = new CxcDetalleFactura();
                    retencionDetalleGroup = new CxpRetencion(); 
                    String striva = listaDetalle.get(0).getCxcAplicaIvaDetFac();
                    double cantidad = 0.0, iva = 0.0;                    
                    if(striva.equals("SI")){
                        iva = Double.parseDouble(MessagesController.obtenervariable("impuesto_IVA"));
                        cantidad =  listaDetalle.get(0).getCxcCantidadDetfac();
                        totalDetalle.setIva2(iva * cantidad);
                        totalDetalle.setTotal(cantidad * (1+iva));
                        listaTotalDetalle.set(0, totalDetalle);
                    }else{
                        iva = 0.0;
                        cantidad =  listaDetalle.get(0).getCxcCantidadDetfac();
                        totalDetalle.setIva2(iva * cantidad);
                        totalDetalle.setTotal(cantidad * (1+iva));
                        listaTotalDetalle.set(0, totalDetalle);
                    }
                } else {
                    MessagesController.addInfo("Mensaje de error :", "Se debe escojer una Cabecera");
                    llamarPanelvisible(null);
                }
            }
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }

    }

    public void modificarDetalle(ActionEvent actionEvent) {
        try {
            if(rowBanderaDetalle >= 0){
                if(detalleFactura.getCxcAplicaRetDetFact().equals("SI")){
                        if(!retencionDetalleGroup.getCxpCodigoRet().equals("-")){
                            detalleFactura.setCxpCodigoRet((CxpRetencion) cxpRetencionManager.getElementById(retencionDetalleGroup.getCxpCodigoRet()));                           
                            String striva = listaDetalle.get(0).getCxcAplicaIvaDetFac();
                            double cantidad = 0.0, iva = 0.0;                    
                            if(striva.equals("SI")){
                                iva = Double.parseDouble(MessagesController.obtenervariable("impuesto_IVA"));
                                cantidad =  listaDetalle.get(0).getCxcCantidadDetfac();
                                totalDetalle.setIva2(iva * cantidad);
                                totalDetalle.setTotal(cantidad * (1+iva));
                                listaTotalDetalle.set(0, totalDetalle);
                            }else{
                                iva = 0.0;
                                cantidad =  listaDetalle.get(0).getCxcCantidadDetfac();
                                totalDetalle.setIva2(iva * cantidad);
                                totalDetalle.setTotal(cantidad * (1+iva));
                                listaTotalDetalle.set(0, totalDetalle);
                            }
                        }else
                            throw new Exception("Debe elejir una retención");
                }else
                    detalleFactura.setCxpCodigoRet(null);
                listaDetalle.set(rowBanderaDetalle, detalleFactura);
            }              
            rowBanderaDetalle = -1;
            detalleFactura = new CxcDetalleFactura();
            retencionDetalleGroup = new CxpRetencion();          
        } catch (Exception e) {
            MessagesController.addInfo("Mensaje de error :", e.getMessage());
            llamarPanelvisible(null);
        }


    }

    
    public void rowSelectionListenerCabecera(RowSelectorEvent event) {
        cabeceraFactura = listaCabecera.get(event.getRow());
        listaDetalle = CxcDetallefacturaManager.buscarporcabecera(cabeceraFactura);
        if(listaDetalle.size()>0){
            String striva = listaDetalle.get(0).getCxcAplicaIvaDetFac();
            double cantidad = 0.0, iva = 0.0;                    
            if(striva.equals("SI")){
                iva = Double.parseDouble(MessagesController.obtenervariable("impuesto_IVA"));
                cantidad =  listaDetalle.get(0).getCxcCantidadDetfac();
                totalDetalle.setIva2(iva * cantidad);
                totalDetalle.setTotal(cantidad * (1+iva));
                listaTotalDetalle.set(0, totalDetalle);
            }else{
                iva = 0.0;
                cantidad =  listaDetalle.get(0).getCxcCantidadDetfac();
                totalDetalle.setIva2(iva * cantidad);
                totalDetalle.setTotal(cantidad * (1+iva));
                listaTotalDetalle.set(0, totalDetalle);
            }
        }else{
            totalDetalle = new TotalDetalle();
            listaTotalDetalle.set(0, totalDetalle);
        }
        switchCabecera(cabeceraFactura);

    }

    public void rowSelectionListenerDetalle(RowSelectorEvent event) {
        rowBanderaDetalle = event.getRow();
        detalleFactura = listaDetalle.get(event.getRow());
        switchDetalle(detalleFactura);
    }    
    
    public void switchDetalle(CxcDetalleFactura detalleFact){
        if(detalleFact.getCxpCodigoRet() != null)
            retencionDetalleGroup = detalleFact.getCxpCodigoRet();
        else
            retencionDetalleGroup.setCxpCodigoRet("-");
    }
}
